package cn.com.header.core.tag;

import cn.com.header.core.util.LangUtils;
import org.apache.commons.lang.time.DateUtils;

import javax.servlet.jsp.JspException;
import javax.servlet.jsp.tagext.TagSupport;
import java.io.IOException;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;


/**
 * 格式化日期时间的标签。
 * @author LinZongxue
 *
 */
@SuppressWarnings("serial")
public class FormatDateTag extends TagSupport {
	private Object value;
	/**
	 * 显示类型：
	 * ·auto （默认）以友好的方式显示日期和时间，如
	 * 		刚刚、5分钟前、3小时前、今天 16:35、昨天 11:35、 前天 11:35、6-7 11:35、2011-6-7（今年以前不显示时间）
	 * ·datetime 显示日期和时间，格式yyyy-MM-dd HH:mm:ss
	 * ·date 只显示日期，格式yyyy-MM-dd
	 * ·time 只显示时间，格式HH:mm:ss
	 */
	private String type;
	/**
	 * 强制格式，如果使用此属性，则type属性无效
	 */
	private String format;
	
	@Override
	public int doStartTag() throws JspException {
		if (value == null || !(value instanceof Date)){
			print(value);
			return super.doStartTag();
		}
		Date dateValue = (Date)value;
		String result = "";
		if (LangUtils.isNotEmpty(format)){
			result = new SimpleDateFormat(format).format(dateValue);
		}
		else if ("datetime".equalsIgnoreCase(type)){
			result = LangUtils.formatDateTime(dateValue);
		}
		else if ("date".equalsIgnoreCase(type)){
			result = LangUtils.formatDate(dateValue);
		}
		else if ("time".equalsIgnoreCase(type)){
			result = LangUtils.formatTime(dateValue);
		}
		else{ //友好的时间显示
			result = friendlyFmt(dateValue);
		}
		print(result);
		return super.doStartTag();
	}
	
	private String friendlyFmt(Date dateValue){
		String result = null;
		Date now = new Date();
		long days = (DateUtils.truncate(now, Calendar.DATE).getTime() - 
				DateUtils.truncate(dateValue, Calendar.DATE).getTime()) / (1000 * 3600 * 24);
		if (days == 0){
			long interval = (now.getTime() - dateValue.getTime()) / 1000 / 60;
			if (interval < 1){
				result = "刚刚";
			}
			else if (interval < 60){
				result = interval + "分钟前";
			}
			else if ((interval /= 60) <= 5){
				result = interval + "小时前";
			}
			else{
				result = "今天 " + new SimpleDateFormat("HH:mm").format(dateValue);
			}
		}
		else if (days == 1){
			result = "昨天 " + new SimpleDateFormat("HH:mm").format(dateValue);
		}
		else if (days == 2){
			result = "前天 " + new SimpleDateFormat("HH:mm").format(dateValue);
		}
		else{
			result =new SimpleDateFormat("MM-dd HH:mm").format(dateValue);
		}
		/*else if (DateUtils.truncatedEquals(now, dateValue, Calendar.YEAR)){ //今年不显示年份
			result = new SimpleDateFormat("M-d HH:mm").format(dateValue);
		}
		else { //今年之前不显示时间
			result = new SimpleDateFormat("yyyy-M-d").format(dateValue);
		}*/
		return String.format("<font title=\"%s\">%s</font>", LangUtils.formatDateTime(dateValue), result);
	}
	
	@Override
	public void release() {
		value = null;
		super.release();
	}
	
	private void print(Object obj){
		try {
			pageContext.getOut().print(obj != null ? obj : "");
		} catch (IOException e) {
			throw new RuntimeException(e);
		}
	}

	public Object getValue() {
		return value;
	}

	public void setValue(Object value){
		this.value = value;
	}

	public String getType() {
		return type;
	}

	public void setType(String type) {
		this.type = type;
	}

	public String getFormat() {
		return format;
	}

	public void setFormat(String format) {
		this.format = format;
	}
}
